package com.cdeledu.thread4.c17;

/**ReadWriteLock虽然名字中有lock，但是它并不是lock，它主要是用于创建read lock和write lock的，并且提供了查询功能用于查询当前有多少个reader和writer以及waiting中的writer，根据我们在前文中的分析，
 * 如果reader的个数大于0，那就意味着writer的个数等于0，反之writer的个数大于0（事实上writer最多只能为1），则reader的个数等于0
 * @author HP
 *
 */
public interface ReadWriteLock {
	
	/**获得一个ReadLock
	 * @return
	 */
	Lock readLock();

	/**获得WriteLock
	 * @return
	 */
	Lock writeLock();

	/**获取当前有多少个线程正在进行写的操作，最多是1个
	 * @return
	 */
	int getWritingWriters();

	/**获取当前有多少线程正在等待获取写入锁
	 * @return
	 */
	int getWaitingWriters();

	/**获取当前有多少个线程正在进行读的操作
	 * @return
	 */
	int getReadingReaders();

	/**工厂方法，创建ReadWriteLock
	 * @return
	 */
	static ReadWriteLock readWriteLock() {
		return new ReadWriteLockImpl();
	}

	/**工厂方法，创建ReadWriteLock，并且传入preferWriter
	 * @param preferWriter
	 * @return
	 */
	static ReadWriteLock readWriteLock(boolean preferWriter) {
		return new ReadWriteLockImpl(preferWriter);
	}

}
